HippoMocks Reference
The HippoMocks tutorial was sufficient for learning, but it's not great as an User's Guide. This is my attempt at producing such a guide. Configuring your project All you have to do is include "hippomocks.h" in your unit test. MockRepository class In your unit test, first create a MockRepository on the stack: MockRepository mocks; InterfaceMock() method MockRepository::InterfaceMock() Used to create an instance of a class that implements a given interface. Usage: IBar *barMock = mocks.InterfaceMock(); The interface is assumed to be a class with only pure virtual methods. Next you would set up behavior for the various virtual methods. Unless you set up these expectations, calling methods of IBar through barMock will throw an exception. ClassMock() method MockRepository::ClassMock() Used to create an instance of a class that has virtual methods. Usage: Bar *barMock = mocks.ClassMock(); Next you would set up behavior for the various pure virtual methods. Unless you set up these expectations, calling pure virtual methods of Bar through barMock will throw an exception. ExpectCall() method TCall MockRepository::ExpectCall( mock, method ) Indicates that the given method on the mock will be called. If the method is not called before the Repository destructs, a runtime error is generated. Assuming a mock is created for interface IBar: IBar *barMock = mocks.InterfaceMock(); If IBar has the following method: virtual void b() = 0; Invoking ExpectCall like so: mocks.ExpectCall(barMock, IBar::b); will set up expectations that method b() be called in the mock. If b() is not called, a runtime error is generated. Multiple ExpectCall methods may be called on the same mock. This sets up expectation that each of those methods will be called in order. For instance, the following sets up expecation that method b() will be called, and then method c(), in that order. mocks.ExpectCall(barMock, IBar::b); mocks.ExpectCall(barMock, IBar::c); If order doesn't matter, autoExpect can be called prior to calls to ExpectCall mocks.autoExpect = false; Method returns a TCall object, which can be used to further refine the expectations of the method call. OnCall() method TCall MockRepository::OnCall( mock, method ) Similar to ExpectCall, except that it's okay if the method doesn't get called. NeverCall() method TCall MockRepository::NeverCall( mock, method ) Similar to ExpectCall, except that it sets up expectation that the method will never be called. ExpectCallOverload() method TCall MockRepository::ExpectCallOverload( mock, method ) If IBar has two methods named c() with different overloads: virtual int c(std::string) = 0; virtual int c(int) = 0; The typical "Expect" call won't work: mocks.ExpectCall(barMock, IBar::c); ExpectCallOverload must be used: mocks.ExpectCallOverload(barMock, (int(IBar::*)(std::string))&IBar::c); Similarly to how ExpectCallOverload is the overload version of ExpectCall: *OnCallOverload is the overload version of OnCall *NeverCallOverload is the overload version of NeverCall TCall class This class is not instantiated directly. It's returned by MockRepository::ExpectCall The TCall class can be used to further refine the expectations of the method call. With() method TCall TCall::With(...) When used, indicates what parameters expected to be passed in. For instance, the following call sets up expectation that method c will be called with argument "hello" mocks.ExpectCall(barMock, IBar::c).With("hello"); With returns the TCall object back, so further refinements can be chained. See TCall::Return Return() method TCall::Return When used, indicates what value the method will return. For instance, the following call sets up expectation that method c will return 42. mocks.ExpectCall(barMock, IBar::c).Return(42); Since TCall::With returns the TCall object, With and Return can be used in the same statement. The following call sets up expectation that method c will return 42 when it's passed argument "hello": mocks.ExpectCall(barMock, IBar::c).With("hello").Return(42); With returns the TCall object back, so further refinements can be chained. See TCall::Return Throw() method TCall::Throw When used, indicates that the method must throw an exception. For instance, the following call sets up expectation that method c will throw an exception when argument "fail" is passed in. mocks.ExpectCall(barMock, IBar::c).With("fail").Throw(std::exception()); With returns the TCall object back, so further refinements can be chained. See TCall::Return Do() method TCall::Do When used, indicates what the method will do by passing in a function pointer. For instance, the following is another way to set up expectation that when argument "hello" is passed in, method c() returns 99: mocks.ExpectCall(barMock, IBar::c).With("hello").Do(SomeGlobalFunction); where SomeGlobalFunction is some static or global function defined as: int someOtherFunction(std::string s) { if ( s "hello" ) return 99; else throw; } With returns the TCall object back, so further refinements can be chained. See TCall::Return After() method TCall::After( Call& ) The After method is used to specify that a particular Expect call should come after the another Expect call. The following sets up the expectation for method c() as follows: *if c() is called with "hello", 1 is returned. *if c() is called with "world", 2 is returned. *if c() is called with "1", 3 is returned. *if c() is called with "2", 4 is returned. *The order of the calls don't matter, because of autoExpect = false, except: **call with argument "1" must come after call with argument "hello" and **call with argument "2" must come after call with argument "world" mocks.autoExpect = false; Call &callOne = mocks.ExpectCall(barMock, IBar::c).With("hello").Return(1); Call &callTwo = mocks.ExpectCall(barMock, IBar::c).With("world").Return(2); mocks.ExpectCall(barMock, IBar::c).After(callOne).With("1").Return(3); mocks.ExpectCall(barMock, IBar::c).After(callTwo).With("2").Return(4); With returns the TCall object back, so further refinements can be chained. See TCall::Return Category:Cheat